1. 基本概念
image: 映像檔。只能讀取。可以從網路下載或是自己建立。
container: 容器。建立在 image 之上,將多個 image 包裝成一個專案環境。
2. 在 Windows 啟用相關功能
啟動 Windows 程式的 HyperV 、虛擬平台、Windows Subsystem,並重啟電腦。
3. 安裝 Ubuntu
到 Microsoft Store 安裝 Ubuntu
安裝, 然後開啟。
接著會自動開啟 Ununtu 命令視窗(shell),要設定帳號密碼。設定完可以先關閉。或是按 exit 退出。
開啟 Windows 的 CMD 視窗,執行 wsl -l -v
中間那個 Ubuntu 所對應的 wsl 如果是 1,請改成 2wsl --set-version Ubuntu 2
4. 安裝 Docker
可以在 google 搜尋 docker hub,第一筆記錄應該就是官網,或是直接使用下面網址
https://hub.docker.com/editions/community/docker-ce-desktop-windows
下載後,檔名是 Docker Desktop Installer.exe 。只要點擊安裝就可以。安裝好後重新啟動 docker。第一次會有同意條款。選擇 Accept 就好。
可能會要求安裝更新包
預設安裝路徑
%localappdata%\Docker\wsl
上面的連結會自動開啟 Windows 使用者資料夾底下的 wsl
像這樣
C:\Users\使用者名稱\AppData\Local\Docker\wsl
使用者名稱要改成自己的。
應該會看到兩個資料夾
C:\Users\使用者名稱\AppData\Local\Docker\wsl\
data
ext4.vhdx 916MB
distro
ext4.vhdx 106MB
進入 docker 程式
Settings / General
把這個打勾 "Use the WSL 2 based engine"
Settings / Resources
把這個打勾 "Enable integration with my default WSL distro"
然後再把 Ubuntu 打開
如果沒有 Ubuntu 的開關,可能是因為沒有先去 Microsoft Store 安裝 Ubuntu,或者雖然裝了,但是 wsl 版本沒有切換到 2
5. 安裝 Windows Terminal
這個不裝也可以。比較 CMD, PowerShell, Windows Terminal,可以參考這篇
https://techwiser.com/command-prompt-vs-powershell-vs-windows-terminal-comparison/
重點: Windows Terminal 可以支援 Linux 子系統,可以用 BASH 指令,例如 ls。還可以分頁。
6. 確認 Windows 資料夾
開啟命令視窗,然後輸入 wsl
預設會進入 C槽的使用者資料夾。可以看到 C 槽掛在 mnt 下面。
在檔案總管輸入 \\wsl$ ,應該可以看到
docker-desktop
docker-desktop-data
Ubuntu
Ubuntu 裡面的 home/[使用者名稱] 是家目錄。將來安裝 container 的時候很有可能會安裝在這裡面。
7. 安裝 node
在 node 官網下載安裝檔。安裝過程問到 chocolatey,這個不用勾。很簡單的安裝。裝完要重新啟動。
8. 建立專案
建立一個資料夾,可以取名為 hello-docker
在裡面建立一個檔案,取名為 app.js,內容只要寫一行console.log("Hello Docker!");
開啟命令視窗,進到這個資料夾,執行 node app.jsD:\docker\hello-docker\node app.js
應該會看到結果
9. 建立image
建立 Dockerfile
D:\docker\hello-docker\Dockerfile
FROM node:alpine
COPY . /app
WORKDIR /app
CMD node /app/app.js
執行docker build -t hello-docker .
注意結尾有一個點
執行完畢之後,到 docker 介面可以看到剛剛建立的 image。檔案會把 node 跟其它東西打包進去,所以雖然自己的內容只有一行,仍高達168MB。
10. 建立container
docker run -d --name hellooo hello-docker
11. 從當前的container再建立成image
請使用 CMD 視窗,不要用 PowerShell。因為後者做出來的容量可能會加倍。下面的網址講到,可能是因為 PowerShell 在輸出的時候會多2個空白字元。
https://stackoverflow.com/questions/40622162/docker-load-and-save-archive-tar-invalid-tar-header
Powershell emits two byte characters to STDOUT, not one byte characters. If you look in the file you'll notice that the TAR header has nulls between what should be the correct header (and in the rest of the file). This explains why the file is twice the size.
提交 image
格式:docker commit 容器名稱 使用者名稱/映像檔名稱docker commit hellooo newhelloo
將映像檔存成 tar 檔docker save newhelloo > newhelloo.tar
12. 匯入
把 docker 裡面的 newhello 這個 image 刪掉。
執行docker load --input newhelloo.tar
這時候可以看到 newhello 又出現在 image 裡面了。
參考
Windows 上的 Docker 引擎
https://docs.microsoft.com/zh-tw/virtualization/windowscontainers/manage-docker/configure-docker-daemon
Docker Tutorial for Beginners
https://www.youtube.com/watch?v=pTFZFxd4hOI